【CDI】データの値によって動的に複数のS3ファイルを作成し、振り分けて出力させてみた
はじめに
こんにちは、データ事業本部の渡部です。
今回はInformaticaのCloud Data Integrationで、S3のディストリビューションカラム
という機能を使用して、S3に対してカラム値にもとづく動的にファイル出力させてみました。
注意点としては、現状振り分けに使用するデータのカラムはS3に出力させなければなりません。
マッピング上で振り分け用にカラムを作成したとしても、そのカラムをファイルに出力させなければエラーとなってしまいます。
検証マッピング
検証用にS3からS3への簡単なマッピングを使用します。
ディストリビューションカラム
ディストリビューションカラム
にフィールドを設定すると、そのフィールドの値ごとに複数ファイルが作成され、フィールド値をもとにレコードが対象ファイルに振り分けられます。
ファイル名は以下のようになります。
- <ターゲットファイル名>+_+<ディストリビューションカラムの値>+<ファイル拡張子>
例:target_aaa.csv
ターゲットの形式オプションからディストリビューションカラム
は設定可能です。
今回はターゲットオブジェクトはtarget.csv、ディストリビューションカラムをageとしました。
Informaticaの公式ドキュメントはこちらです。
注意点
- オブジェクトタイプが
Flat
のみ(CSVやTSVなど)使用可能で、ParquetやAvroなど他のファイル形式は使用できません。 ディストリビューションカラム
は1つしか設定できません。- 前述のとおりカラムに指定したフィールドはターゲットで出力フィールドである必要があります。
もしも出力フィールドとして指定していない場合、以下のようなエラーが発生します。
[ERROR] DistributionColumn Name: age provided is not present in Target field list. Provide a valid/mapped target field.
実行してみた
今回使用するS3のソースファイルは以下のとおりです。
ディストリビューションカラム
であるageは16,51,67の3種類の値を持ちます。
id | name | age | address |
---|---|---|---|
1 | Yamazaki Kana | 16 | 41-20-3 Shimo-Yoshiha |
2 | Suzuki Yui | 51 | 4-1-13 Shibancho |
3 | Kobayashi Taichi | 16 | 20-9-13 Marunouchi |
4 | Yamashita Yosuke | 51 | 9-5-5 Yumiyama |
5 | Ito Akemi | 67 | 23-22-16 Nishikanda |
6 | Kato Yumiko | 51 | |
7 | Yamamoto Yui | 16 | 33-18-6 Misugi |
8 | Takahashi Sotarou | 51 | 36-2-12 Katsudoki |
実行してみるとターゲットのS3には3ファイル出力されました。
データの中身もディストリビューションカラム
に設定したageに基づいてデータが振り分けられていることが確認できました。
"id","name","age","address"
"1","Yamazaki Kana","16","41-20-3 Shimo-Yoshiha"
"3","Kobayashi Taichi","16","20-9-13 Marunouchi"
"7","Yamamoto Yui","16","33-18-6 Misugi"
"id","name","age","address"
"2","Suzuki Yui","51","4-1-13 Shibancho"
"4","Yamashita Yosuke","51","9-5-5 Yumiyama"
"6","Kato Yumiko","51",""
"8","Takahashi Sotarou","51","36-2-12 Katsudoki"
"id","name","age","address"
"5","Ito Akemi","67","23-22-16 Nishikanda"
まとめ
以上、ディストリビューションカラムのご紹介でした。
データによってファイルを振り分けたいという要望はそこそこ出てくるため、そのような場合に使用していけるかと思います。
ターゲットがSecureAgentサーバーにファイルを出力させるフラットファイル出力であれば、振り分けに使用するカラムを出力させないようにすることがアップデートで可能になったのですが、S3はまだ対応されていません。
アップデートを待ちたいと思います。